import time

from flask import request, jsonify, json
from flask_script import Manager,Server
from flask_migrate import Migrate,MigrateCommand
from app import db,app
#注册蓝图
from utils.myjwt import myjwt
from utils.myredis import r
from views.user import user_blue
app.register_blueprint(user_blue)

# 生成管理工具对象
manager = Manager(app)
# 添加服务器运行指令
manager.add_command("runserver",Server(host='0.0.0.0',use_debugger=True))

# 数据库迁移
Migrate(app,db)
# 添加数据库的操作指令
manager.add_command("db", MigrateCommand)


@app.before_request
# 使用before_request：在每次请求校验当前用户是否有接口权限
def before_request():
    # 获取当前请求
    url = request.path
    # print("当前请求url", url)
    # 白名单
    lst = ["/login","/qntoken","/bdapi","/Exit"]
    # 判断当前请求是否在白名单内
    if url not in lst:
        #  获取token
        token = request.headers.get('token')
        # print("获取头部token", token)
        try:
            # 判断token是否正确
            flag = myjwt.check(token)
            if flag == True:
                # print("true")
                # 解析验证时间
                payload = myjwt.jwt_decode(token)
                # 获取过期时间
                ptime = payload['data']['exptime']
                # 当前时间
                now = time.time()
                # 判断是否过期
                if int(now) - int(ptime) > 3600:
                    return jsonify({"code": 402, "msg": "token过期"})
                # 判断此用户是否退出
                key = 'logout'
                # 将加入队列的token取出
                res = r.sortedset_getall(key)
                if res:
                    for i in res:
                        # 判断携带的token是否在队列中
                        if token == i.decode():
                            return jsonify({"code": 409, "msg": "当前用户已退出"})
                # 判断用户是否有权限访问接口
                # print(payload['data'])
                urls = r.str_get("prepare" + str(payload['data']['userid']))
                # print("urls>>>>>>>>>>>>>>>>>>>", json.loads(urls))
                # 预防get请求携带参数导致无权限
                url = url.split("?")
                # 判断当前请求是否在缓存中（是否有权限）
                if url[0] not in json.loads(urls):
                    return jsonify({"code": 400, "msg": "无权访问"})
            else:
                return jsonify({"code": 403, "msg": "token错误"})
        except Exception as a:
            print("错误信息:", a)
            return jsonify({"code": 401, "msg": "没有携带token"})




#如果是以此脚本作为主脚本程序，就执行
if __name__ == '__main__':
    # manager.run()
    app.run(port=8000)
